<?php

/**
 * @package docBookCompiler
 * @author Vladimir Krivosheev
 * @version $Id: DocBookCompiler.php 10 2006-10-22 08:22:25Z develar $
 */
class DocBookCompiler
{
	const FILE_EXTENSION = 'xml';

	protected $outputFile;

	/**
	 * Сборка отражения логической структуры документа на файловую систему в один файл
	 * @param string $input_dir
	 * @param string $output_file
	 */
	public function __construct($input_dir, $output_file)
	{
		$this->outputFile = $output_file;
		file_put_contents($this->outputFile, '');
		$this->compile($input_dir, '');
	}

	/**
	 * @param string $dir Каталог файлов для компиляции
	 * @param string $id ID раздела документа (index-файла)
	 */
	protected function compile($dir, $id)
	{
		$files = scandir($dir);
		$Parser = new Parser_docBookCompiler($dir, $id);

		$index_file = array_search(Parser_docBookCompiler::INDEX_FILE_NAME, $files);
		if ($index_file === false)
		{
			throw new LogicException('There is no index file in the directory: ' . $dir);
		}
		else
		{
			// в списке обрабатываемых файлов index не нужен - он обрабатывается иначе
			unset($files[$index_file]);
			$Parser->openIndex();

			$this->append($Parser->openIndex());
		}

		natsort($files);
		foreach ($files as $file_name)
		{
			if (!in_array($file_name[0], array('.', '_')))
			{
				if (is_file($dir . DIRECTORY_SEPARATOR . $file_name) AND pathinfo($file_name, PATHINFO_EXTENSION) == self::FILE_EXTENSION AND $file_name != $this->outputFile)
				{
					$this->append($Parser->doc($file_name));
				}
				else
				{
					$current_id = '';
					// для корневого тега выходного документа id не задаем
					if ($id != '')
					{
						$current_id = $id . '.';
					}
					$current_id .= self::deleteOrderNumber($file_name);
					$this->compile($dir . DIRECTORY_SEPARATOR . $file_name, $current_id);
				}
			}
		}
		$this->append($Parser->closeIndex());
	}

	public static function deleteOrderNumber($name)
	{
		return preg_replace('~^\d+-~', '', $name);
	}

	public static function fileNameToId($file_name)
	{
		return str_replace('.' . self::FILE_EXTENSION, '', self::deleteOrderNumber($file_name));
	}

	/**
	 * Добавляет к результирующему файлу данные
	 * @param string $data
	 */
	public function append($data)
	{
		file_put_contents($this->outputFile, $data, FILE_APPEND);
	}
}

?>